package br.com.sisat.persistencia.DAO;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import br.com.sisat.modelo.EspecialidadeDTO;
import br.com.sisat.modelo.RelatorioPlanoSaudeDTO;
import br.com.sisat.modelo.TerapeutaDTO;
import br.com.sisat.persistencia.conexao.ConnectionProvider;
import br.com.sisat.util.ObjectUtil;
import br.com.sisat.util.UtilDatas;

public class RelatorioPlanoSaudeDAO {

	private static RelatorioPlanoSaudeDAO dao;
	
	public static RelatorioPlanoSaudeDAO getInstance(){
		if(ObjectUtil.isEmpty(dao)){
			dao = new RelatorioPlanoSaudeDAO();
		}
		return dao;
	}
	
	public List<EspecialidadeDTO> recuperarEspecialidades() throws Exception {
		List<EspecialidadeDTO> especialidades = new ArrayList<EspecialidadeDTO>();
		String sql = " SELECT id_especialidade, nome FROM sat.especialidade order by id_especialidade;";
		Connection conn = ConnectionProvider.getDefaultConnection();
		PreparedStatement ps = conn.prepareStatement(sql);
		ResultSet rs = ps.executeQuery();
		while(rs.next()){
			EspecialidadeDTO especialidade = new EspecialidadeDTO();
			especialidade.setIdEspecialidade(rs.getLong("id_especialidade"));
			especialidade.setNoEspecialidade(rs.getString("nome"));
			especialidades.add(especialidade);
		}
		conn.close();
		return especialidades;
	}

	public List<TerapeutaDTO> recuperarTerapeutas() throws Exception {
		List<TerapeutaDTO> terapeutas = new ArrayList<TerapeutaDTO>();
		String sql = " SELECT DISTINCT terapeuta.id_pessoa, pessoa.nome" +
					 " FROM sat.terapeuta terapeuta" +
					 " join sat.pessoa pessoa on (terapeuta.id_pessoa = pessoa.id_pessoa) order by terapeuta.id_pessoa;";
		Connection conn = ConnectionProvider.getDefaultConnection();
		PreparedStatement ps = conn.prepareStatement(sql);
		ResultSet rs = ps.executeQuery();
		while(rs.next()){
			TerapeutaDTO terapeuta = new TerapeutaDTO();
			terapeuta.setIdTerapeuta(rs.getLong("id_pessoa"));
			terapeuta.setNoTerapeuta(rs.getString("nome"));
			terapeutas.add(terapeuta);
		}
		conn.close();
		return terapeutas;
	}

	public List<RelatorioPlanoSaudeDTO> relatorioPlanos(RelatorioPlanoSaudeDTO relPlanSaude) throws Exception {
		List<RelatorioPlanoSaudeDTO> relatorioPlano = new ArrayList<RelatorioPlanoSaudeDTO>();
		String sql = "SELECT consulta.nu_plano_saude, count(*) as total_plano_saude, plano.no_plano_saude " +
				     "FROM sat.consulta consulta " +
				     "join sat.terapeuta terapeuta on (consulta.id_terapeuta = terapeuta.id_terapeuta) " +
				     "JOIN sat.plano_saude plano on (plano.nu_plano_saude = consulta.nu_plano_saude) "+
				     "join sat.especialidade especialidade on (terapeuta.id_especialidade = especialidade.id_especialidade) " +
				     "join sat.pessoa pessoa on (terapeuta.id_pessoa = pessoa.id_pessoa) " +
				     "WHERE 1=1 and consulta.nu_status = 2 ";
					  
		if(!ObjectUtil.isEmpty(relPlanSaude.getDataInicio())){
			sql = sql + " and (consulta.data > '" + UtilDatas.strToSQLDate(relPlanSaude.getDataInicio()).toString()+" ')"; 
					 
		}
		if(!ObjectUtil.isEmpty(relPlanSaude.getDataFim())){
			sql = sql + " and (consulta.data < '" + UtilDatas.strToSQLDate(relPlanSaude.getDataFim()).toString() +" ')";
		}
		
		if(!ObjectUtil.isEmpty(relPlanSaude.getNuEspecialidade()) && relPlanSaude.getNuEspecialidade() != 0){
			sql = sql + " and especialidade.id_especialidade = " + relPlanSaude.getNuEspecialidade().toString();
		}
		
		if(!ObjectUtil.isEmpty(relPlanSaude.getNuTerapeuta()) && relPlanSaude.getNuTerapeuta() != 0){
			sql = sql + " and pessoa.id_pessoa = " + relPlanSaude.getNuTerapeuta().toString();
		}
		
		if(!ObjectUtil.isEmpty(relPlanSaude.getNuPlanoSaude()) && relPlanSaude.getNuPlanoSaude() != 0){
			sql = sql + " and consulta.nu_plano_saude = " + relPlanSaude.getNuPlanoSaude().toString();
		}
		
		sql = sql +	 " group by consulta.nu_plano_saude,plano.no_plano_saude;";
		
		Connection conn = ConnectionProvider.getDefaultConnection();
		PreparedStatement ps = conn.prepareStatement(sql);
		ResultSet rs = ps.executeQuery();
		while(rs.next()){
			RelatorioPlanoSaudeDTO relatorio = new RelatorioPlanoSaudeDTO();
			relatorio.setNuPlanoSaude(rs.getLong("nu_plano_saude"));
			relatorio.setTotalPlanoSaude(rs.getLong("total_plano_saude"));
			relatorio.setNoPlanoSaude(rs.getString("no_plano_saude"));
			relatorioPlano.add(relatorio);
		}
		conn.close();
		return relatorioPlano;
	}
	
	public List<RelatorioPlanoSaudeDTO> relatorioEspecialidades(RelatorioPlanoSaudeDTO relPlanSaude) throws Exception {
		List<RelatorioPlanoSaudeDTO> relatorioEspecialidade = new ArrayList<RelatorioPlanoSaudeDTO>();
		String sql = "SELECT especialidade.nome, count(*) as total_especialidade  " +
					     "FROM sat.consulta consulta " +
					     "join sat.terapeuta terapeuta on (consulta.id_terapeuta = terapeuta.id_terapeuta) " +
					     "join sat.especialidade especialidade on (terapeuta.id_especialidade = especialidade.id_especialidade) " +
					     "join sat.pessoa pessoa on (terapeuta.id_pessoa = pessoa.id_pessoa) " +
					     "WHERE consulta.nu_status = 2 ";

			if(!ObjectUtil.isEmpty(relPlanSaude.getDataInicio()) &&
				!ObjectUtil.isEmpty(relPlanSaude.getDataFim())){
					sql = sql + " and (consulta.data > '" + UtilDatas.strToSQLDate(relPlanSaude.getDataInicio()).toString()  + 
							  "' and consulta.data < '" + UtilDatas.strToSQLDate(relPlanSaude.getDataFim()).toString() +" ')";
			}
			
			if(!ObjectUtil.isEmpty(relPlanSaude.getNuEspecialidade()) && relPlanSaude.getNuEspecialidade() != 0){
					sql = sql + " and especialidade.id_especialidade = " + relPlanSaude.getNuEspecialidade().toString();
			}
			
			if(!ObjectUtil.isEmpty(relPlanSaude.getNuTerapeuta()) && relPlanSaude.getNuTerapeuta() != 0){
					sql = sql + " and pessoa.id_pessoa = " + relPlanSaude.getNuTerapeuta().toString();
			}
			
			if(!ObjectUtil.isEmpty(relPlanSaude.getNuPlanoSaude()) && relPlanSaude.getNuPlanoSaude() != 0){
					sql = sql + " and consulta.nu_plano_saude = " + relPlanSaude.getNuPlanoSaude().toString();
			}
				     
			sql = sql +  "group by especialidade.nome";
		
		Connection conn = ConnectionProvider.getDefaultConnection();
		PreparedStatement ps = conn.prepareStatement(sql);
		ResultSet rs = ps.executeQuery();
		while(rs.next()){
			RelatorioPlanoSaudeDTO relatorio = new RelatorioPlanoSaudeDTO();
			relatorio.setNoEspecialidade(rs.getString("nome"));
			relatorio.setTotalEspecialidade(rs.getLong("total_especialidade"));
			relatorioEspecialidade.add(relatorio);
		}
		conn.close();
		return relatorioEspecialidade;
	}
	
	public List<RelatorioPlanoSaudeDTO> relatorioTerapeutas(RelatorioPlanoSaudeDTO relPlanSaude) throws Exception {
		List<RelatorioPlanoSaudeDTO> relatorioTerapeuta = new ArrayList<RelatorioPlanoSaudeDTO>();
		String sql = " SELECT pessoa.nome, count(*) as total_terapeuta  " +
					     " FROM sat.consulta consulta " +
					     " join sat.terapeuta terapeuta on (consulta.id_terapeuta = terapeuta.id_terapeuta) " +
					     " join sat.especialidade especialidade on (terapeuta.id_especialidade = especialidade.id_especialidade) " +
					     " join sat.pessoa pessoa on (terapeuta.id_pessoa = pessoa.id_pessoa) " +
					     " WHERE consulta.nu_status=2  ";

			if(!ObjectUtil.isEmpty(relPlanSaude.getDataInicio()) &&
			!ObjectUtil.isEmpty(relPlanSaude.getDataFim())){
				sql = sql + " and (consulta.data > '" + UtilDatas.strToSQLDate(relPlanSaude.getDataInicio()).toString()  + 
						  "' and consulta.data < '" + UtilDatas.strToSQLDate(relPlanSaude.getDataFim()).toString() +" ')";
			}
			
			if(!ObjectUtil.isEmpty(relPlanSaude.getNuEspecialidade()) && relPlanSaude.getNuEspecialidade() != 0){
				sql = sql + " and especialidade.id_especialidade = " + relPlanSaude.getNuEspecialidade().toString();
			}
			
			if(!ObjectUtil.isEmpty(relPlanSaude.getNuTerapeuta()) && relPlanSaude.getNuTerapeuta() != 0){
				sql = sql + " and pessoa.id_pessoa = " + relPlanSaude.getNuTerapeuta().toString();
			}
			
			if(!ObjectUtil.isEmpty(relPlanSaude.getNuPlanoSaude()) && relPlanSaude.getNuPlanoSaude() != 0){
				sql = sql + " and consulta.nu_plano_saude = " + relPlanSaude.getNuPlanoSaude().toString();
			}
			
			sql = sql + "group by pessoa.nome";
		
		Connection conn = ConnectionProvider.getDefaultConnection();
		PreparedStatement ps = conn.prepareStatement(sql);
		ResultSet rs = ps.executeQuery();
		while(rs.next()){
			RelatorioPlanoSaudeDTO relatorio = new RelatorioPlanoSaudeDTO();
			relatorio.setNoTerapeuta(rs.getString("nome"));
			relatorio.setTotalTerapeuta(rs.getLong("total_terapeuta"));
			relatorioTerapeuta.add(relatorio);
		}
		conn.close();
		return relatorioTerapeuta;
	}
}
